package com.miya.order.configure.rabbitmq.topic;

import cn.hutool.core.util.StrUtil;
import com.miya.constant.MiyaConstant;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 主题演示侦听器
 *
 * @author Caixiaowei
 * @date 2022/01/20
 */
@Component
@Slf4j
public class TopicDemoListener {

    private Integer retryConsumeCount = 3;

    @RabbitListener(queues = MiyaConstant.TOPIC_DEMO_QUEUE)
    public void process(Message message, Channel channel) throws IOException, InterruptedException {
        String messageId = message.getMessageProperties().getMessageId();
        /**
         * 防止重复消费，可以根据传过来的唯一ID先判断缓存数据中是否有数据
         * 1、有数据则不消费，直接应答处理
         * 2、缓存没有数据，则进行消费处理数据，处理完后手动应答
         * 3、如果消息 处理异常则，可以存入数据库中，手动处理（可以增加短信和邮件提醒功能）
         */
        if (StrUtil.isEmpty(messageId)) {
            return;
        }
        try {
            // TODO 具体业务
            // 清除重试消费缓存
//            redisService.delete(RedisConstans.APPROVAL_COMSUME_RETRY + StrUtil.COLON + messageId);

        } catch (Exception e) {
            log.error("TopicDemoListener 消费失败,message: {}, error: {}", new String(message.getBody(), "UTF-8"), e);
            /**
             * 处理消息失败，将消息重新放回队列
             * 重试消费失败3次后, 手动ack, 通知管理员, 并记录该单据
             */
            // 重试次数: 可以用redis 计数
//            redisService.incr(RedisConstans.APPROVAL_COMSUME_RETRY + StrUtil.COLON + messageId, 1L);
//            Object retryCount = redisService.get(RedisConstans.APPROVAL_COMSUME_RETRY + StrUtil.COLON + messageId);
            Integer retryCount = null;

            if (Long.valueOf(retryCount.toString()) > retryConsumeCount) {
                channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
                // TODO 通知管理员
            } else {
                Thread.sleep(3000L);
                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false,true);
            }

        }

    }
}
